Mi objetivo es setApprovalForAll para un contrato de token antes de ejecutar la función safeTransferFrom para cada tokenId en la colección NFT. De esta manera, podré transferir NFT a otra dirección sin que MetaMask solicite varias aprobaciones.
Sin embargo, recibo un error al ejecutar la función safeTransferFrom , se activa el siguiente error:
Esto sucede incluso después de llamar a la función setApprovalForAll . La transacción setApprovalForAll parece haber sido exitosa también:

pero llamar a isApprovedForAll dice lo contrario (ver el comentario en la línea 16 del código).
Creo que es posible que el error se genere debido a que no llamé a la función setApprovalForAll correctamente, porque ¿por qué otra razón isApprovedForAll devolvería false ?
document.querySelector('.click-me').onclick = async () => { const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = await provider.getSigner(); const CONTRACT_ADDRESS = '0x...'; // token contract address const RECEIVER_ADDRESS = '0x...'; // this address expected to get approval for all const ABI = [ 'function setApprovalForAll(address operator, bool _approved)', 'function safeTransferFrom(address from, address to, uint256 tokenId)', 'function isApprovedForAll(address owner, address operator) view returns (bool)' ]; const contract = new ethers.Contract(CONTRACT_ADDRESS, ABI, signer); try { const isApproved = await contract.isApprovedForAll(CONTRACT_ADDRESS, RECEIVER_ADDRESS); console.log(isApproved); // returns false even after several attempts await contract.setApprovalForAll(RECEIVER_ADDRESS, true); // seems to work fine, even shows in MetaMask activity // ERROR SEEMS TO OCCUR HERE const test = await contract.safeTransferFrom(CONTRACT_ADDRESS, RECEIVER_ADDRESS, 749); // 749 is my NFT tokenId console.log(test); } catch (error) { console.log(error.message) } };Debe cambiar la dirección del contrato al propietario del NFT, consulte a continuación
document.querySelector('.click-me').onclick = async () => { const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = await provider.getSigner(); const CONTRACT_ADDRESS = '0x...'; // token contract address const RECEIVER_ADDRESS = '0x...'; // this address expected to get approval for all const ABI = [ 'function setApprovalForAll(address operator, bool _approved)', 'function safeTransferFrom(address from, address to, uint256 tokenId)', 'function isApprovedForAll(address owner, address operator) view returns (bool)' ]; const contract = new ethers.Contract(CONTRACT_ADDRESS, ABI, signer); try { const isApproved = await contract.isApprovedForAll(CONTRACT_ADDRESS, RECEIVER_ADDRESS); console.log(isApproved); // returns false even after several attempts await contract.setApprovalForAll(RECEIVER_ADDRESS, true); // seems to work fine, even shows in MetaMask activity // FIXED const test = await contract.safeTransferFrom(signer.address, RECEIVER_ADDRESS, 749); // 749 is my NFT tokenId console.log(test); } catch (error) { console.log(error.message) } };